package com.example.leave.service;

import com.example.leave.common.CommonPage;
import com.example.leave.component.equator.FieldInfo;
import com.example.leave.dto.LeaveFormDto;
import com.example.leave.form.*;

import java.util.List;

public interface LeaveService {
    /**
     * 分页获取所有请假表单
     *
     * @param pageInfoForm 分页信息
     * @return CommonPage<LeaveFormDto> 装有LeaveFormDto列表的分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> getAll(PageInfoForm pageInfoForm);

    /**
     * 添加请假表单
     *
     * @param leaveFormForm 需要的请假表单信息
     * @return 是否成功
     * @author 黄贵波
     * @Time 2020/12/5
     */
    boolean add(LeaveFormForm leaveFormForm);

    /**
     * 通过id删除单个请假表单
     *
     * @param id 请假表id
     * @return 是否成功
     * @author 黄贵波
     * @Time 2020/12/5
     */
    boolean delOneById(String id);

    /**
     * 通过id列表删除单个请假表单
     *
     * @param ids 请假表id列表
     * @return 成功删除数
     * @author 黄贵波
     * @Time 2020/12/5
     */
    int delByIdList(List<String> ids);

    /**
     * 通过id更新请假表单
     *
     * @param idAndLeaveFormForm 请假表id和要更新的请假信息
     * @return 更新前后不同数据对比
     * @author 黄贵波
     * @Time 2020/12/5
     */
    List<FieldInfo> updateById(IdAndLeaveFormForm idAndLeaveFormForm);

    /**
     * 查找在某个时间段缺席的请假表单
     *
     * @param timeConditionForm 时间段和分页对象
     * @return 某个时间段缺席的请假表单列表的分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> findWhoWasAbsentAtSometime(TimeConditionForm timeConditionForm);

    /**
     * 判断某人是否在这个时间段有请假记录
     *
     * @param userIdAndTimeBetweenForm 用户id和时间段和分页对象
     * @return 是否在这个时间段有请假记录
     * @author 黄贵波
     * @Time 2020/12/5
     */
    boolean isSomeoneHasLeaveAtSometime(IdAndTimeBetweenForm userIdAndTimeBetweenForm);

    /**
     * 通过请假类别进行LIKE搜索
     *
     * @param categoryAndPageInfoVo 类别和分页对象
     * @return 类别和参数匹配的请假表单分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> findByCategoryLike(ConditionAndPageInfoForm categoryAndPageInfoVo);

    /**
     * 通过请假原因进行LIKE搜索
     *
     * @param ReasonAndPageInfoVo 原因和分页对象
     * @return 原因和参数匹配的请假表单分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> findByReasonLike(ConditionAndPageInfoForm ReasonAndPageInfoVo);

    /**
     * 通过Id搜索
     *
     * @param id 表单id
     * @return 表单id和参数匹配的请假表单数据传输对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    LeaveFormDto findById(String id);

    /**
     * 查询单个用户在某个时间段请假的请假单
     *
     * @param userIdAndTimeBetweenAndPageInfoVo 用户id和时间区间和分页对象
     * @return 符合条件的请假表单数据传输对象的分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> findByUserIdAndStartTimeBetween(IdAndTimeBetweenAndPageInfoVoForm userIdAndTimeBetweenAndPageInfoVo);

    /**
     * 通过开始时间区间搜索
     *
     * @param startTimeBetweenAndPageInfoForm 开始的时间区间和分页对象
     * @return 符合条件的请假表单数据传输对象的分页对象
     * @author 黄贵波
     * @Time 2020/12/5
     */
    CommonPage<LeaveFormDto> findByStartTimeBetween(TimeBetweenAndPageInfoForm startTimeBetweenAndPageInfoForm);
}
